//-----------------------------------------
// 	PicOS Project
//
// 	HEPIA 2014 - Florent Gluck
//
//	Denis Voirol		Pierre Kiss
//	Ruben Magnin		Alina Stanculescu
//	Sebastien Beureux	Julien Cornut
//-----------------------------------------
//
//	syscall.c
//
//	get_stat
//
//-----------------------------------------

#include "file_handler.h"
#include "const.h"
#include "sectors.h"
#include "console.h"
#include "mem.h"
#include "math.h"


int getStat(char *fileName, File_entry *feOut)
{
	int index = FE_SECT;
	while(!getNextFile(feOut,&index))
	{
		if (strcmp(feOut->name,fileName)) {
			return 1;
		}
	}
	return 0;		// erreur
}

int getNextFile(File_entry *fe, int *index) 
{
	int status=0;
	char buf[SECT_SIZE];
	
	do{
		if(*index>=DATA_SECT | *index<FE_SECT) return 1; 
		status = readSect(*index, buf);
		*index=(*index+1);
	}while(!buf[0]);

	memCopy(fe,buf,sizeof(*fe));
	
	return 0;
}

int readFile (char* file_name, char* buf)
{
	uint index = FE_SECT;
	File_entry fe;
	uint nb_sector;
	int i;
	char status;

	do
	{
		status = getNextFile(&fe,&index);
		if(status == 1) 							//Recupere fichier sans erreur
		{
			printString("readFile erreur : Fichier non trouve\n");
			return -1;
		}
	}
	while(!strcmp(fe.name, file_name));				//Trouve fichier avec son nom

	nb_sector = (((fe.sizeH-1)>>9)+1);				//Size / 512 arrondi sup

	for(i=0; i<nb_sector; i++)
	{
		index = DATA_SECT + (fe.sect_index[i]-1);	//Parcourt index
		readSect(index,buf);
		buf += SECT_SIZE;							//Incremente adresse buffer
	}
	return 0;
}


int removeFile (char* file_name)
{
	File_entry fe;
	char status,i,bits,bit,sect_index,bits_index;
	char buf[SECT_SIZE];
	uint nb_sector;
	uint index = FE_SECT;

	//Recuperation fichier
	do
	{
		status = getNextFile(&fe,&index);
		if(status == 1) 							//Sans erreur
		{
			printString("removeFile erreur : Fichier non trouve\n");
			return -1;
		}
	}
	while(!strcmp(fe.name, file_name));				//Trouve fichier avec son nom

	//MAJ file entry
	fe.name[0] = 0;									//Nom plus valide
 	writeSect(index-1,&fe);							//Ecrit nouveau file entry

	//Vide dernier secteur de donnees
	nb_sector = (((fe.sizeH-1)>>9)+1);				//Size / 512 arrondi sup		
													//Trouve dernier secteur
	index = DATA_SECT + (fe.sect_index[nb_sector-1]-1);
	memSet(&buf,0,SECT_SIZE);
	writeSect(index,buf);							//Y ecrit des 0

	//MAJ bitmap
	readSect(BITMAP_SECT, buf);						//Recupere bitmap
	for(i=0; i<nb_sector; i++)
	{
		sect_index = fe.sect_index[i]-1;			//Index 1er secteur = 1
		bits_index = sect_index/8;

		bits = buf[bits_index];
		bit = 8-(((sect_index) & 7)+1);
		bits &= ~(1<<bit);							//Clear bit
		buf[bits_index] = bits;
	}
	writeSect(BITMAP_SECT, buf);					//Ecrit nouveau bitmap
	return 0;
}


